#ifndef CLOCK_H
#define CLOCK_H

#include "TP.h"
#include "Dato.h"
#include "IClockeable.h"
#include "Tiempo.h"

//==============================================================================

typedef tDato tClock;

/*
 * clockCrear:
 *      Define el clock.
 * Pre:
 *      -
 * Pos:
 *      El clock se encuentra operacional.
 */
void clockCrear (tClock* pClock);

/*
 * clockDestruir:
 *      Libera los recursos del clock.
 * Pre:
 *      Clock debe haber sido definido mediante clockCrear.  Antes de invocar a 
 * esta funcion se deben haber cancelado todas las suscripciones mediante la 
 * función clockCancelarSuscripciones; caso contrario la función no tendra efecto.
 * 
 * Pos:
 *      El clock queda indefinido e inutilizable.
 */
void clockDestruir (tClock pClock);

/*
 * clockCorrer:
 *      Avanza el clock el tiempo especificado y notifica a los suscriptores
 * dicho evento.
 * 
 * Pre:
 *      Clock debe haber sido definido mediante clockCrear.
 *      
 */
void clockCorrer (tClock pClock, tTiempo pTiempo);

/*
 * clockGetTiempo:
 *      cuando se avanza el tiempo, esta funcion retorna la cantidad de
 * tiempo que se indico avanzar al clock.
 * 
 * Pre:
 *      Clock debe haber sido definido mediante clockCrear.  pTiempo debe ser
 * mayor o igual a 0.
 */
tTiempo clockGetTiempo (tClock pClock);

/*
 * clockSuscribir:
 *      cuando se indica al clock avanzar un intervalo de tiempo, el clock notifica
 * a sus suscriptores el evento.  Esta función permite a una entidad suscribirse
 * al clock a fin de recibir las notificaciones de avance de tiempo.
 * 
 * Pre:
 *      Clock debe haber sido definido mediante clockCrear.  La entidad debe implementar
 * la interfase IClockeable.
 */
void clockSuscribir (tClock pClock, tDato pSuscriptor, tFcnClockNotificar pFcnNotificar);

/*
 * clockCancelarSuscripcion:
 *      remueve un suscriptor de la lista de suscriptores.
 * 
 * Pre:
 *      Clock debe haber sido definido mediante clockCrear.  
 */
void clockCancelarSuscripcion (tClock pClock, tDato pSuscriptor);

/*
 * clockCancelarSuscripciones:
 *      remueve a todos los suscriptores de la lista de suscripcion.
 * 
 * Pre:
 *      Clock debe haber sido definido mediante clockCrear.
 */
void clockCancelarSuscripciones (tClock pClock);

#endif /*CLOCK_H*/
